package com.itheima.myiotest1;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.http.HttpUtil;

import java.util.*;

public class Test2 {
    public static void main(String[] args) {
        /*
         制造假数据：
             获取姓氏：https://www.tianshuge.com/gushuguji/baijiaxing/62237.html
             获取男生名字：http://www.haoming8.cn/baobao/10881.html
             获取女生名字：http://www.haoming8.cn/baobao/7641.html
        */

        //1.定义变量记录网址
        String familyNameNet = "https://www.tianshuge.com/gushuguji/baijiaxing/62237.html";
        String boyNameNet = "http://www.haoming8.cn/baobao/10881.html";
        String girlNameNet = "http://www.haoming8.cn/baobao/7641.html";

        //2.爬取数据，把网上所有的数据拼接成一个字符串
        String familyNameStr = HttpUtil.get(familyNameNet);
        String boyNameStr = HttpUtil.get(boyNameNet);
        String girlNameStr = HttpUtil.get(girlNameNet);

        //3.通过正则表达式，把符合要求的数据获取出来
        List<String> familyNameTmpList = ReUtil.findAll("([\u4E00-\u9FA5]{4} ){3,5}[\u4E00-\u9FA5]{4}", familyNameStr, 0);
        List<String> boyNameTmplist = ReUtil.findAll("([\u4E00-\u9FA5]{2})(、|。)", boyNameStr, 1);
        List<String> girlNameTmplist = ReUtil.findAll("(.. ){4}..", girlNameStr, 0);

        //4.处理数据
        //familyNameTempList（姓氏）
        //处理方案：把每一个姓氏拆开并添加到一个新的集合当中
        ArrayList<String> familyNamelist = new ArrayList<>();
        for (String s : familyNameTmpList) {
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if (c != ' ') {
                    familyNamelist.add(c + "");
                }
            }
        }

        //boyNameTempList（男生的名字）
        //处理方案：去除其中的重复元素
        ArrayList<String> boyNamelist = new ArrayList<>();
        for (String s : boyNameTmplist) {
            if (!boyNamelist.contains(s)) {
                boyNamelist.add(s);
            }
        }

        //girlNameTempList（女生的名字）
        //处理方案：把里面的每一个元素用空格进行切割，得到每一个女生的名字
        ArrayList<String> girlNamelist = new ArrayList<>();
        for (String s : girlNameTmplist) {
            String[] arr = s.split(" ");
            for (int i = 0; i < arr.length; i++) {
                girlNamelist.add(arr[i]);
            }
        }

        //5.生成数据
        //姓名（唯一）-性别-年龄
        ArrayList<String> list = getInfo(familyNamelist, boyNamelist, girlNamelist, 70, 50);
        Collections.shuffle(list);
        //System.out.println(list);

        //6.写出数据
        //细节：
        //糊涂包的相对路径，不是相对于当前项目而言的，而是相对class文件而言的
        FileUtil.writeLines(list,"names.txt","UTF-8");
    }

    /*
     * 作用：
     *      获取男生和女生的信息：张三-男-23
     *
     * 形参：
     *      参数一：装着姓氏的集合
     *      参数二：装着男生名字的集合
     *      参数三：装着女生名字的集合
     *      参数四：男生的个数
     *      参数五：女生的个数
     * */
    public static ArrayList<String> getInfo(ArrayList<String> familyNamelist, ArrayList<String> boyNamelist, ArrayList<String> girlNamelist, int boyCount, int girlCount) {
        //1.定义一个集合用来存储男生的姓名，姓名不可以重复
        HashSet<String> boyhs = new HashSet<>();
        //获取随机姓名
        while (true) {
            if (boyhs.size() == boyCount) {
                break;
            }
            //随机
            Collections.shuffle(familyNamelist);
            Collections.shuffle(boyNamelist);
            boyhs.add(familyNamelist.get(0) + boyNamelist.get(0));
        }

        //2.定义一个集合用来存储女生的姓名，姓名不可以重复
        HashSet<String> girlhs = new HashSet<>();
        //获取随机姓名
        while (true) {
            if (girlhs.size() == girlCount) {
                break;
            }
            //随机
            Collections.shuffle(familyNamelist);
            Collections.shuffle(girlNamelist);
            girlhs.add(familyNamelist.get(0) + girlNamelist.get(0));
        }

        //3.生成男生的信息并添加到集合当中
        ArrayList<String> list = new ArrayList<>();
        Random r = new Random();
        //男生年龄[18-27]
        for (String boyName : boyhs) {
            int boyAge = r.nextInt(10) + 18;
            list.add(boyName + "-男-" + boyAge);
        }

        //女生年龄[18-25]
        for (String girlName : girlhs) {
            int girlAge = r.nextInt(8) + 18;
            list.add(girlName + "-女-" + girlAge);
        }

        return list;
    }
}
